package com.xhui.vimarket.zkplus.zul.attr.mod;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.zkoss.zk.ui.Component;
import org.zkoss.zul.Div;

import com.xhui.vimarket.common.utils.vo.RetVO;
import com.xhui.vimarket.zkplus.zul.attr.AttrExt;
import com.xhui.vimarket.zkplus.zul.attr.ada.AttrExecListener;
import com.xhui.vimarket.zkplus.zul.attr.bean.AttrInst;
import com.xhui.vimarket.zkplus.zul.attr.bean.AttrTmpl;
import com.xhui.vimarket.zkplus.zul.attr.bean.ValiVo;


/**
 * @版权：福富软件 版权所有 (c) 2010
 * @文件：com.xhui.vimarket.zkplus.zul.attr.mod.AttrComp.java
 * @所含类：
 * @author: wuyx
 * @version: V1.0
 * @see:
 * @创建日期：2010-12-20
 * @功能说明：属性控件接口
 * @修改记录： =============================================================<br>
 *        日期:2010-12-20 创建
 *        =============================================================<br>
 */
public interface AttrComp {
    
    /**
     * 生成组件.
     * 
     * @param attrExt 组件控件
     * @param attrTmpl 组件模板
     * @param comp 显示容器组件
     */
    void create(AttrExt attrExt, AttrTmpl attrTmpl, Component comp);
    
    /**
     * 设置值.
     * 
     * @param attrExt 组件控件
     * @param comp 组件
     * @param attrInst 属性实例
     * @param attrViewMap 信息权限列表 控制框架的信息
     */
    void setValue(AttrExt attrExt, Component comp, List<AttrInst> attrInst,Map<String, Integer> attrViewMap);
    
    /**
     * 设置本次删除值.
     * 
     * @param attrExt 组件控件
     * @param comp 组件
     * @param attrInst 属性实例
     */
    void setRemovedValue(AttrExt attrExt, Component comp, List<AttrInst> attrInst);
    
    /**
     * 赋值不允许采集实例数据.
     * 
     * @param attrExt 组件控件
     * @param comp 组件
     * @param attrInst 属性实例
     */
    void setDisabledValue(AttrExt attrExt, Component comp, List<AttrInst> attrInst);
    
    /*    *//**
               * 赋值不允许展示实例数据.
               * 
               * @param comp 组件
               */
    /*
    void setHideValue(Component comp, Map<String, Boolean> attrViewMap);*/

    /**
     * 设置信息显示控制.
     * 
     * @param comp 组件
     */
    void setAttrView(Component comp, Map<String, Integer> attrViewMap);
    
    /**
     * 设置约束  如不可拷贝等.
     * 
     * @param comp 组件
     */
    void setAttrConstrain(Component comp, Map<Object, String> attrConstrainMap);
    
    /**
     * 设置值对象的实例Id.
     * @param attrExt 组件控件
     * @param comp 组件
     * @param attrInstId 属性实例id
     * @author wuyx
     */
    void setValueInstId(AttrExt attrExt, Component comp, long attrInstId);
    
    /**
     * 设置值对象的实例data.
     * @param attrExt 组件控件
     * @param comp 组件
     * @param data Object
     * @author wuyx
     */
    void setValueInstData(AttrExt attrExt, Component comp, Object data);
    
    /**
     * 获取值.
     * 
     * @param attrExt 组件控件
     * @param comp 组件
     * @return ArrayList<AttrInst>
     */
    ArrayList<AttrInst> getValue(AttrExt attrExt, Component comp);
    
    /**
     * 获取空值.
     * 
     * @param attrExt 组件控件
     * @param comp 组件
     * @return ArrayList<AttrInst>
     */
    ArrayList<AttrInst> getNullValue(AttrExt attrExt, Component comp);
    
    /**
     * 必填标记.
     * 
     * @param attrExt 组件控件
     * @param comp 组件
     * @return ArrayList<ValiVo>
     */
    ArrayList<ValiVo> signRuleHint(AttrExt attrExt, Component comp);
    
    /**
     * 清空值.
     * 
     * @param attrExt 组件控件
     * @param comp 组件
     */
    void clean(AttrExt attrExt, Component comp);
    
    /**
     * 取空值属性实例.
     * 
     * @param attrExt 组件控件
     * @param attrTmpl 模板
     * @return ArrayList<AttrInst>
     */
    ArrayList<AttrInst> getNullValue(final AttrExt attrExt, final AttrTmpl attrTmpl);
    
    /**
     * 重新生成下级组件.
     * 
     * @param attrExt 组件控件
     * @param attrTmpl 组件根
     * @param newSubAttrTmplList 组件模板
     * @param comp 本 控件容器组件
     * @author wuyx
     * 传入本级控件根目录，替换新的模板定义，并刷新界面显示
     */
    void reCreateSub(AttrExt attrExt, AttrTmpl attrTmpl, List<AttrTmpl> newSubAttrTmplList,
        Component comp);
    
    /**
     * 获取控件根目录.
     * 
     * @param attrExt 组件控件
     * @param comp 组件
     * @param attrId long
     * @return List<Component>
     */
    List<Component> getComp(AttrExt attrExt, Component comp, final long attrId);
    
    /**
     * 获取控件根目录.
     * 
     * @param attrExt 组件控件
     * @param comp 组件
     * @param javaCode String
     * @return List<Component>
     */
    List<Component> getComp(AttrExt attrExt, Component comp, final String javaCode);
    
    /**
     * 生成公用的工具栏.
     * @param parantComp Component
     * @param isVisible boolean
     * @param attrTmpl AttrTmpl
     * @return Div
     * @author wuyx
     * 2011-2-11 wuyx 
     */
    Div createToolbox(Component parantComp, boolean isVisible, AttrTmpl attrTmpl);
    
    /**
     * 设置为不允许修改.
     * 
     * @param attrExt 组件控件
     * @param comp 组件
     * @param tflag 设置值，true/false
     */
    void setDisabled(AttrExt attrExt, Component comp, boolean tflag);
    
    /**
     * 设置为不可见.
     * 
     * @param attrExt 组件控件
     * @param comp 组件
     * @param tflag 设置值，true/false
     */
    void setVisible(AttrExt attrExt, Component comp, boolean tflag);
    
    /**
     * 执行外部指定方法.
     * 
     * @param attrExt 组件控件
     * @param comp 组件
     * @param attrExecListener AttrExecListener
     * @author wuyx
     * 2011-3-16 wuyx 
     */
    void exec(final AttrExt attrExt, final Component comp, AttrExecListener attrExecListener);
    
    /**
     * 获取值.
     * 
     * @param attrExt 组件控件
     * @param comp 组件
     * @return List<RetVO>
     */
    List<RetVO> validate(AttrExt attrExt, Component comp);
    
    /**
     * 获取值.
     * 
     * @param attrExt 组件控件
     * @param comp 组件
     */
    void refreshButtonText(AttrExt attrExt, Component comp, final List<AttrInst> attrInstList);
    
    /**
     * 获取提示信息参照控件.
     * 
     * @param comp Component
     * @return Component
     * @author wuyx
     * 2011-7-19 wuyx 
     */
    Component getMsgComp(Component comp);
    
}
